#include"main.h"

int init_queue(Queue** q) {
	*q = (Queue*)malloc(sizeof(Queue));
	(*q)->size = 0;
	(*q)->front = &((*q)->elements[0]);
	(*q)->rear = (*q)->front;
	return 0;
}

// 在队列q的尾巴上增加一个元素，其值为value。增加成功，返回0；增加失败，返回1
int enqueue(Queue* q, int value) {
	if (q->size == 0) {
		*(q->rear) = value;
		if (q->rear == (q->elements + 100)) {
			q->rear = &(q->elements[0]);
		}
		else {
			(q->rear)++;
		}
		if (q->rear == q->front) {
			q->size = 1;
		}
		return 0;
	}
	return 1;
}

// 从队列q上摘取（去掉）一个元素，将其值放入value中。摘取成功，返回0；摘取失败，返回1。
int dequeue(Queue* q, int* value){
	if (q->size == 0 && q->rear == q->front) {
		return 1;
	}
	q->size = 0;
	*value = *(q->front);
	if (q->front == (q->elements + 100)) {
		q->front = &(q->elements[0]);
	}
	else {
		(q->front)++;
	}
	return 0;
}

// 获取队列q的第一个元素，但是并不去掉该元素，并将该值放入value中。获取成功返回0；获取失败，返回1。 
int first(Queue* q, int* value){
	if (q->size == 0 && q->rear == q->front) {
		return 1;
	}
	else {
		*value = *(q->front);
	}
	return 0;
}

// 判断队列q是否为空。为空，返回0；不为空，返回1。 
int is_empty(Queue* q){
	if ((q->front) == (q->rear) && q->size == 0) {
		return 0;
	}
	return 1;
}

// 返回队列q中的元素个数。 
int size(Queue* q){
	if ((q->front) == (q->rear) && q->size == 1) {
		return QUEUE_MAX_SIZE;
	}
	return q->rear - q->front;
}

int main() {
	Queue* p = 0;
	int value = 0;
	init_queue(&p);
	for (int a = 0; a < 120; a++) {
		enqueue(p, a);
	}
	for (int a = 0; a < 120; a++) {
		dequeue(p, &value);
	}
	for (int a = 0; a < 20; a++) {
		enqueue(p, a);
	}
	first(p, &value);
	printf("%p    %p    %d    %d", p->front, p->rear, size(p),value);
	return 0;
}